// cf-264c
// 题意：给定n(<=10^5)个球，每个球有价值v[i]以及颜色co[i](co[i] in [1..n])，
//       现在有q(<=500)个询问，每个询问是一对a, b。
//       对于每个询问，要按原顺序取出若干球，对于不是在第一个位置且
//       与前一个球颜色想等的球总价值加上v[i]*a，否则加上v[i]*b。
//       现在要求这个总价值的最大值。
//
// 题解：O(n*log(n)*q)的dp很好想，每个球要么从相同颜色转来，要么从不同颜色
//       最大值转来。所以可以用线段树来维护每个颜色当前最大值。
//
//       不过这样复杂度有点紧，事实上我们令dp[i]表示到当前以i颜色结尾的最
//       大值，我们只需要维护所有1～n的dp[i]的两个最大值，它肯定会至少包含
//       一个与当前球不同的颜色。
//
//       所以这样复杂度降到了O(n*q)。
//
// run: $exec < input
#include <iostream>
#include <algorithm>

int const maxn = 100007;
long long constexpr inf = (1ll) << 50;
long long v[maxn];
int co[maxn];
long long dp[maxn];
int n, q;

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin >> n >> q;
	for (int i = 1; i <= n; i++) std::cin >> v[i];
	for (int i = 1; i <= n; i++) std::cin >> co[i];
	for (int i = 0; i < q; i++) {
		for (int i = 1; i <= n; i++) dp[i] = -inf;
		long long a, b;
		std::cin >> a >> b;
		long long first = -inf, second = -inf;
		int co1 = 0, co2 = -1;
		for (int i = 1; i <= n; i++) {
			long long t1 = first + v[i] * (co1 == co[i] ? a : b);
			long long t2 = second + v[i] * (co2 == co[i] ? a : b);
			t2 = std::max(t1, t2);
			t2 = std::max(t2, b * v[i]);
			t2 = std::max(t2, dp[co[i]] + v[i] * a);
			if (t2 > dp[co[i]]) {
				dp[co[i]] = t2;
				if (co1 == co2) {
					second = t2; co2 = co[i];
				} else if (t2 > first) {
					if (co[i] == co1) first = t2;
					else {
						co2 = co1; second = first;
						first = t2; co1 = co[i];
					}
				} else if (t2 > second) {
					second = t2; co2 = co[i];
				}
			}
		}
		std::cout << std::max(first, 0ll) << '\n';
	}
}
